﻿package wangshuai.risk.service.impl;

import hejie.admin.dao.EnterpriseTypeDao;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import publics.model.Company;
import publics.util.Page;
import wangshuai.risk.dao.CompanyDao;
import wangshuai.risk.service.CompanyService;


@Component("companyService")
public class CompanyServiceImpl implements CompanyService {

	private CompanyDao companyDao;
	private EnterpriseTypeDao enterpriseTypeDao;
	

	public EnterpriseTypeDao getEnterpriseTypeDao() {
		return enterpriseTypeDao;
	}
	@Resource(name="enterpriseTypeDao")
	public void setEnterpriseTypeDao(EnterpriseTypeDao enterpriseTypeDao) {
		this.enterpriseTypeDao = enterpriseTypeDao;
		System.out.println("enterpriseTypeDaoImpl inject in CompanyServiceImpl");
	}
	public CompanyDao getCompanyDao() {
		return companyDao;
	}	
	@Resource(name="companyDao")
	public void setCompanyDao(CompanyDao companyDao) {
		this.companyDao = companyDao;
		System.out.println("companyDaoImpl inject in CompanyServiceImpl");
	}




	public Object saveCompany(Company company) {
		//此处实际中还要加入验证代码，比如说 公司已经存在啊，等等
		
		return companyDao.save(company);
	}



	public Page findByPage(Page page) {
		
		StringBuffer sql = new StringBuffer();
		sql.append("from Company c left join fetch c.etype ");
		if(page.getConditions().size() > 0){//这里为模糊查询的 sql 语句拼接 请仔细体会
			sql.append(" where ");  
			for(int i = 0; i < page.getConditions().size(); ){
				sql.append("( c.companyName like '%").append(page.getConditions().get(i)).append("%'")//查询条件一  公司名字字段
				.append(" or c.address like '%").append(page.getConditions().get(i)).append("%'")
				.append(" or c.etype in ( select id from EnterpriseType e where e.name like '%").append(page.getConditions().get(i)).append("%' ) ")
				//上面这句是在企业类型表里找符合条件的企业类型，因为企业类型是外键，所以要这么做。
				.append(" or c.remark like '%").append(page.getConditions().get(i)).append("%'")
				.append(" or c.leader like '%").append(page.getConditions().get(i)).append("%' ) ");
				// 以上 在 四个字段搜索数据 ，这几个字段关系为 or 即或者的关系。理论上可以设置任意多字段，只需继续用 拼接。
				// 注意 语句中 有  ( ) 符号，在第一条 和最后一条一定要加上， 为什么要加上自己体会。
 				//以下为多条件的连续拼接， 为 and 的关系 。如果还是不能理解，请实践下，看看生成的sql语句是什么。
				i++;
				if(i < page.getConditions().size()){// 如果条件不止一个 进行连续拼接
					sql.append(" and ");
				}
			}
		}
		System.out.println("sql ="+sql);// 测试用，请观察拼接出的sql语句，加强理解
		int pageSize = page.getLimit();
		int offset = page.getStart();//-1)*pageSize;
		page.setRoot(companyDao.findByPage(sql.toString(),offset,pageSize));//把查询结果放入root中
		page.setTotalProperty(companyDao.findByCount(sql.toString()));   //把数据总数放入totalProperty中		
		
		
//		String sql;			
		/**
		 * 此版本为用String 拼接， （上面是StringBuffer拼接，效率更好点，占内存更少）
		 * 这个模糊查询语句的生成请每个人仔细体会下
		 */	
		/*sql = "from Company c ";
		if(page.getConditions().size() > 0){//这里为模糊查询的 sql 语句拼接 请仔细体会
			sql = sql + " where ";  
			for(int i = 0; i < page.getConditions().size(); ){
				sql = sql + "( c.companyName like '%"+page.getConditions().get(i)+"%'"//查询条件一  公司名字字段
				+" or c.address like '%"+page.getConditions().get(i)+"%'"
				+" or c.etype in ( select id from EnterpriseType e where e.name like '%"+page.getConditions().get(i)+"%' ) "
				//上面这句是在企业类型表里找符合条件的企业类型，因为企业类型是外键，所以要这么做。
				+" or c.remark like '%"+page.getConditions().get(i)+"%'"
				+" or c.leader like '%"+page.getConditions().get(i)+"%' ) ";
				// 以上 在 四个字段搜索数据 ，这几个字段关系为 or 即或者的关系。理论上可以设置任意多字段，只需继续用 拼接。
				// 注意 语句中 有  ( ) 符号，在第一条 和最后一条一定要加上， 为什么要加上自己体会。
 				//以下为多条件的连续拼接， 为 and 的关系 。如果还是不能理解，请实践下，看看生成的sql语句是什么。
				i++;
				if(i < page.getConditions().size()){// 如果条件不止一个 进行连续拼接
					sql = sql + " and ";
				}
			}
		}
		System.out.println("sql ="+sql);// 测试用，请观察拼接出的sql语句，加强理解
	
		int pageSize = page.getLimit();
		int offset = page.getStart();//-1)*pageSize;
		page.setRoot(companyDao.findByPage(sql,offset,pageSize));//把查询结果放入root中
		page.setTotalProperty(companyDao.findByCount(sql));   //把数据总数放入totalProperty中
	*/
		return page;
	}

	public boolean updateCompany(Company company) {
		return companyDao.update(company);
	}

	public boolean deleteCompany(Integer companyId) {
		//System.out.println("service里 companyId="+companyId);
		return companyDao.deleteById(companyId);

	}

}
